/* 
 * UsuarioBO.java
 * Copyright (c) Faculdade Anhanguera de Anápolis.
 * Tecnologia em Análise e Desenvolvimento de Sistemas.
 * Projeto Multidisciplinar de Autoaprendizagem.
 *
 * Este software é confidencial e propriedade da Faculdade Anhanguera de Anápolis.
 * Não é permitida sua distribuição ou divulgação do seu conteúdo sem expressa autorização da Faculdade Anhanguera de Anápolis.
 * Este arquivo contém informações proprietárias.
 */
package br.com.pma.chamatec.business.impl;

import java.util.Date;
import java.util.List;

import javax.ejb.Stateless;
import javax.inject.Inject;

import br.com.pma.chamatec.business.IUsuarioBO;
import br.com.pma.chamatec.dao.ChamadoDAO;
import br.com.pma.chamatec.dao.FuncionarioDAO;
import br.com.pma.chamatec.dao.UsuarioDAO;
import br.com.pma.chamatec.exception.ChamatecExceptionCode;
import br.com.pma.chamatec.exception.ChamatecNegocioException;
import br.com.pma.chamatec.util.ChamatecUtil;
import br.com.pma.entity.Chamado;
import br.com.pma.entity.Funcionario;
import br.com.pma.entity.Usuario;

/**
 * Classe de negócio da entidade Usuario.
 *
 * @author Ludemeula Fernandes de Sá
 */
@Stateless
public class UsuarioBO implements IUsuarioBO {
	@Inject
	private UsuarioDAO usuarioDAO;

	@Inject
	private FuncionarioDAO funcionarioDAO;

	@Inject
	private ChamadoDAO chamadoDAO;

	/**
	 * @see br.com.pma.chamatec.business.IUsuarioBO#salvar(br.com.pma.entity.Usuario)
	 */
	@Override
	public Usuario salvar(Usuario usuario) throws ChamatecNegocioException {
		usuario.setDataRegistro(new Date());
		usuario.setIsAtivo(true);
		usuario.setIsExcluido(false);
		usuario.setSenha(ChamatecUtil.generateMD5(usuario.getSenha()));

		validaCamposObrigatorios(usuario);
		Usuario cpfEncontrado = usuarioDAO.recuperarPorCpf(usuario);
		if (cpfEncontrado != null && cpfEncontrado.getId() != null && usuario.getId() != cpfEncontrado.getId()) {
			throw new ChamatecNegocioException(ChamatecExceptionCode.ME_004);
		}

		Usuario loginEncontrado = usuarioDAO.recuperarPorLogin(usuario);
		if (loginEncontrado != null && loginEncontrado.getId() != null && usuario.getId() != loginEncontrado.getId()) {
			throw new ChamatecNegocioException(ChamatecExceptionCode.ME_005);
		}
		usuario = usuarioDAO.merge(usuario);
		return usuario;
	}

	/**
	 * @return 
	 * @see br.com.pma.chamatec.business.IUsuarioBO#remover(br.com.pma.entity.Usuario)
	 */
	@Override
	public Usuario remover(Usuario usuario) throws ChamatecNegocioException {
		usuario.setIsExcluido(true);
		validarReferencias(usuario);

		usuario = usuarioDAO.merge(usuario);
		return usuario;
	}

	/**
	 * @see br.com.pma.chamatec.business.IUsuarioBO#getListDescricao()
	 */
	@Override
	public List<Usuario> getListDescricao() throws ChamatecNegocioException {
		return usuarioDAO.getListDescricao();
	}

	/**
	 * @see br.com.pma.chamatec.business.IUsuarioBO#pesquisar(br.com.pma.entity.Usuario)
	 */
	@Override
	public List<Usuario> pesquisar(Usuario usuario) throws ChamatecNegocioException {
		List<Usuario> retorno = usuarioDAO.pesquisar(usuario);
		if (retorno == null || retorno.size() == 0) {
			throw new ChamatecNegocioException(ChamatecExceptionCode.ME_001);
		}
		return retorno;
	}

	/**
	 * @see br.com.pma.chamatec.business.IUsuarioBO#recuperarPorLogin(br.com.pma.entity.Usuario)
	 */
	@Override
	public Usuario recuperarPorLogin(Usuario usuario) throws ChamatecNegocioException {
		if (usuario == null || usuario.getLogin() == null) {
			throw new ChamatecNegocioException(ChamatecExceptionCode.MI_003);
		}
		usuario = usuarioDAO.recuperarPorLogin(usuario);
		return usuario;
	}

	/**
	 * @see br.com.pma.chamatec.business.IUsuarioBO#recuperarPorNome(br.com.pma.entity.Usuario)
	 */
	@Override
	public Usuario recuperarPorNome(Usuario usuario) throws ChamatecNegocioException {
		if (usuario == null || usuario.getNome() == null) {
			throw new ChamatecNegocioException(ChamatecExceptionCode.MI_003);
		}
		return usuarioDAO.recuperarPorNome(usuario);
	}

	/**
	 * @see br.com.pma.chamatec.business.IUsuarioBO#recuperarPorLoginComPerfil(br.com.pma.entity.Usuario)
	 */
	@Override
	public Usuario recuperarPorLoginComPerfil(Usuario usuario) throws ChamatecNegocioException {
		if (usuario == null || usuario.getLogin() == null) {
			throw new ChamatecNegocioException(ChamatecExceptionCode.ME_001);
		}
		return usuarioDAO.recuperarPorCpfComPerfil(usuario);
	}

	/**
	 * @see br.com.pma.chamatec.business.IUsuarioBO#recuperarFuncionarioPorCpf(br.com.pma.entity.Usuario)
	 */
	@Override
	public Usuario recuperarFuncionarioPorCpf(Usuario usuario) throws ChamatecNegocioException {
		if (usuario.getCpf() != null && !usuario.getCpf().equals("")) {
			Funcionario funcionarioEncontrado = funcionarioDAO.recuperarPorCpf(usuario);
			if (funcionarioEncontrado == null || funcionarioEncontrado.getCpf().equals("")) {
				usuario.setNome("");
				
				throw new ChamatecNegocioException(ChamatecExceptionCode.ME_008);
			}
			
			usuario.setFuncionario(funcionarioEncontrado);
			usuario.setNome(funcionarioEncontrado.getNome());
		}

		return usuario;
	}
	
	/**
	 * Realiza a validação dos campos obrigatórios.
	 * 
	 * @param usuario
	 * @throws ChamatecNegocioException
	 */
	private void validaCamposObrigatorios(Usuario usuario) throws ChamatecNegocioException {
		if (usuario.getNome() == null || usuario.getNome().equals("")) {
			throw new ChamatecNegocioException(ChamatecExceptionCode.ME_002);
		}

		if (usuario.getLogin() == null || usuario.getLogin().equals("")) {
			throw new ChamatecNegocioException(ChamatecExceptionCode.ME_002);
		}

		if (usuario.getSenha() == null || usuario.getSenha().equals("")) {
			throw new ChamatecNegocioException(ChamatecExceptionCode.ME_002);
		}

		if (usuario.getPerfil() == null || usuario.getPerfil().getId() == 0) {
			throw new ChamatecNegocioException(ChamatecExceptionCode.ME_002);
		}

		if (usuario.getEmail() == null || usuario.getEmail().equals("")) {
			throw new ChamatecNegocioException(ChamatecExceptionCode.ME_002);
		}
	}

	/**
	 * Valida as referências de Chamado não deixando excluir um usuario quando existir estas referências.
	 * 
	 * @param usuario
	 * @throws ChamatecNegocioException
	 */
	private void validarReferencias(Usuario usuario) throws ChamatecNegocioException {
		List<Chamado> resultado = chamadoDAO.pesquisarPorUsuario(usuario);
		if (resultado != null && resultado.size() > 0)  {
			throw new ChamatecNegocioException(ChamatecExceptionCode.ME_019);
		}
	}
}